package o2o.config.redis.service;

import o2o.config.redis.basic.ListData;
import o2o.config.redis.basic.MapData;
import o2o.config.redis.basic.SingleData;

import java.util.List;
import java.util.Map;

/**
 * redis数据缓存服务
 * @author :ld
 * @date :2021/6/4
 */
public interface RedisCacheService {
    /**
     * 产生1800到3600秒之间的整数
     * @return 随机过期时间
     */
    Integer randomTime();

    /**
     * 缓存单个对象,需要注意的是这里如果之前缓存中有值，则会覆盖
     * @param t 对象
     * @param key 格式:业务唯一key
     * @return 当前被缓存对象
     */
    <T> T addSingleCache(T t, String key);

    /**
     * 缓存单个对象,需要注意的是这里如果之前缓存中有值，则会覆盖
     * @param t 对象
     * @param key 格式:业务唯一key
     * @param seconds 过期时间
     * @return 当前被缓存对象
     */
    <T> T addSingleCache(T t, String key, Long seconds);

    /**
     * 查询对象：缓存不存在，查询数据，再返回，同时还要放入缓存中
     *              注意：缓存时间0.5-1小时之间
     * @param singleData 缓存对象
     * @param key 业务唯一key
     * @return 对象
     */
    <T> T singleCache(SingleData<T> singleData, String key);

    /**
     * 查询对象：缓存不存在，查询数据，再返回，同时还要放入缓存中
     * @param singleData 缓存对象
     * @param key 业务唯一key
     * @param seconds 过期时间
     * @return 对象
     */
    <T> T singleCache(SingleData<T> singleData, String key, Long seconds);

    /**
     * 删除singleCache缓存
     * @param key 业务唯一key
     * @return 是否删除成功
     */
    Boolean delSingleCache(String key);


    /**
     * 查询list对象：缓存不存在，查询数据，再返回，同时还要放入缓存中
     *              注意：缓存时间0.5-1小时之间
     * @param listData 缓存对象
     * @param key 业务唯一key
     * @return 对象集合
     */
    <T> List<T> listCache(ListData<T> listData, String key,Class<T> tClass);

    /**
     * 查询list对象：缓存不存在，查询数据，再返回，同时还要放入缓存中
     *              注意：缓存时间0.5-1小时之间
     * @param listData 缓存对象
     * @param key 业务唯一key
     * @param seconds 过期时间
     * @return 对象集合
     */
    <T> List<T> listCache(ListData<T> listData, String key, Long seconds,Class<T> tClass);

    /**
     * 删除list缓存
     * @param key 业务唯一key
     * @return 是否删除成功
     */
    Boolean delListCache(String key);

    /**
     * 查询mapData对象缓存不存在，查询数据，再返回，同时还要放入缓存中
     *              注意：缓存时间0.5-1小时之间
     * @param mapData 缓存对象
     * @param key 业务唯一key
     * @return map对象
     */
    <K, V> Map<K, V> mapCache(MapData<K, V> mapData, String key);

    /**
     * 查询mapData对象缓存不存在，查询数据，再返回，同时还要放入缓存中
     *              注意：缓存时间0.5-1小时之间
     * @param mapData 缓存对象
     * @param key 业务唯一key
     * @param seconds 过期时间
     * @return map对象
     */
    <K, V> Map<K, V> mapCache(MapData<K, V> mapData, String key, Long seconds);

    /**
     * 删除mapCache缓存
     * @param key 业务唯一key
     * @return 是否删除成功
     */
    Boolean delMapCache(String key);


}
